#ifndef RECONSTRUCTION_LIMITERFUNCTION_HPP
#define RECONSTRUCTION_LIMITERFUNCTION_HPP

namespace hms
{

enum class LimiterFunction {
	none, minMod, vanAlbada 
	// ,vanLeer, superbee, umist, 
	// quick, mc
};

enum class ReconstructionType {
	firstOrder, secondOrder, central
};

template<typename T>
using Pair = std::array<T, 2>;

struct EdgeValues {
	RowArray2s  dLR, zLR, hLR;
	ArrayNNs<2,2> vLR;

	RowArray2s psiDH;
	ArrayNNs<2,2> psiQ;
};

struct EdgesValues {
	Pair<Array1XsMap> dLR, zLR, hLR;
	Pair<Array2XsMap> vLR, vRotLR;

	Pair<Array1XsMap> psiDH;
	Pair<Array2XsMap> psiQ;
};

// using std::experimental::observer_ptr;

// struct CellValues {
// 	observer_ptr<const RowArray2s>
// 		dLR   {nullptr},
// 		dLLRR {nullptr},
// 		hLR   {nullptr},
// 		hLLRR {nullptr};

// 	observer_ptr< const ArrayNNs<2,2> >
// 		qLR   {nullptr},
// 		qLLRR {nullptr};
// };

// using QMapMomentum = Eigen::Map< const Array2Xs,0,Eigen::OuterStride<3> >;

// struct CellsValues {
// 	observer_ptr< const Pair<Array1XsCMap> >
// 		dLR   {nullptr},
// 		dLLRR {nullptr},
// 		hLR   {nullptr},
// 		hLLRR {nullptr};

// 	observer_ptr< const Pair<QMapMomentum> >
// 		qLR   {nullptr},
// 		qLLRR {nullptr};
// };

} // namespace hms

#endif